#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <random>
#include <condition_variable>
#include <atomic>

#define FREEDOM_STATE_SECOND 10

using namespace std;
using namespace chrono;

// 模拟定时器, FREEDOM_STATE_SECOND s 的时间后进入自由模式
class Monitor
{
  public:
	typedef enum
	{
		Normal,
		Freedom
	} State;

	Monitor();

	~Monitor();

	void run();

	// 开始监控
	void start();

	// 停止监控
	void stop();

	// 进入自由模式
	void enterFreedomMode();

	// 进入正常模式
	void enterNormalMode();

  private:
	void loop();

	time_point<system_clock> startTime;
	time_point<system_clock> endTime;

	atomic_bool started; // 开始监控是否进入自由模式
	atomic_bool running; // 线程是否开始运行

	mutex mutStart;
	condition_variable condStart;

	thread *t;
};
